from datetime import datetime

# 转换orm对象为dict

class ResponseFactory(object):

    @staticmethod
    def model_to_dict(obj, *ignore: str):
        '''
        将User此类实例转换为dict。由于orm实例都继承了db.Model类，
        所以他们都有__table__属性，也就有了相关字段的信息。
        :param obj: 要转换的orm 对象
        :param ignore: 要忽略的字段
        :return:
        '''
        # 收集转换后的数据字典 {}
        data = dict()

        for c in obj.__table__.columns:
            # __table__.columns 是ORM 对象的列的集合，每一个元素都是列对象，列对象的name 就是 定义模型的列名
            if c.name in ignore:
                # 如果字段忽略，则不进行转换
                continue
            val = getattr(obj, c.name) # getattr 获取实例/对象的属性值 (参考test7)
            # JSON中没有对应的datetime格式，所以我们需要对他也进行转换。
            if isinstance(val, datetime):
                data[c.name] = val.strftime("%Y-%m-%d %H-%M-%S")
            else:
                data[c.name] = val
        return data

    @staticmethod
    def model_to_list(data:list, *ignore: str):
        # 一个列表生成式，对每条orm实例都进行了转换，最终返回一个list(orm object)
        return [ResponseFactory.model_to_dict(x, *ignore) for x in data]
